package com.example.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;
import com.example.service.impl.NianXiuJiaServiceImp;

import lombok.extern.slf4j.Slf4j;

/**
 * SQLconnect.JDBC_DRIVER  数据库驱动
 * SQLconnect.DB_URL       数据库连接
 * SQLconnect.USER         数据库账户
 * SQLconnect.PASS         数据库密码
 * List<Map<String,Object>> selectData2MapList(String sql, String... params)  查询
 * void execute(String sql, String... params)                                 新增/修改
 * 使用示例：参考 com.jinzhenghb.ec9.ljl.FireExtinguisherCheckService  包含了查询，新增，修改
 * @author litao
 */
@Slf4j
public  class MyJDBCUtils {
	/**
	 * 数据库驱动
	 */
	public static String JDBC_DRIVER = "com.mysql.jdbc.Driver";
	/**
	 * 数据库连接 测试库
	 */
//	public static String DB_URL = "jdbc:mysql://10.0.100.247:3306/ecology9";
	
	/**
	 * 数据库连接 正式库
	 */
	public static String DB_URL = "jdbc:mysql://10.0.6.93:3306/ecology9";
	
	/**
	 * 数据库账户
	 */
	public static String USER = "fw";
	/**
	 * 数据库密码
	 */
	public static String PASS = "JZFW@2020";

	/**
	 * 获取数据库连接
	 * @return Connection
	 */
	static Connection mysqlConnect() {
		try {
			Connection conn = null;
			// 注册 JDBC 驱动
			Class.forName(JDBC_DRIVER);
			// 打开链接
			conn = DriverManager.getConnection(DB_URL, USER, PASS);
		
			log.info("【com.jinzhenghb.ec9.tools.SQLconnect】--数据库连接");
			return conn;
		} catch (Exception e) {
			e.printStackTrace();
			log.info("【com.jinzhenghb.ec9.tools.SQLconnect】--数据库连接异常:" + e.getMessage());
			System.out.println("【com.jinzhenghb.ec9.tools.SQLconnect】--数据库连接异常:" + e.getMessage());
			return null;
		}
	}

	/**
	 * 释放资源
	 * @param conn Connection
	 * @param pstmt Statement
	 * @param rs ResultSet
	 */
	static void release(Connection conn, Statement pstmt, ResultSet rs) {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (pstmt != null) {
			try {
				pstmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 根据sql语句查询结果返回list
	 * @param sql 查询的sql语句
	 * @param params 不定个数的参数
	 * @return Map的key:数据库字段名,value:字段值
	 */
	public static List<Map<String,Object>> selectData2MapList(String sql, String... params) {
		log.info("【com.jinzhenghb.ec9.tools.SQLconnect】--查询数据库获取数据，sql:" + sql + "，参数:" + JSONObject.toJSONString(params));
		System.out.println("【com.jinzhenghb.ec9.tools.SQLconnect】--查询数据库获取数据，sql:" + sql + "，参数:" + JSONObject.toJSONString(params));
		List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
		// 连接
		Connection conn = MyJDBCUtils.mysqlConnect();
		// 创建执行 SQL 的语句Statement
		PreparedStatement stmt = null;
		// SQL执行结果
		ResultSet rs = null;
		try {
			stmt = conn.prepareStatement(sql,params);
			for (int i = 0; i < params.length; i++) {
				stmt.setString(i+1, params[i]);
			}
			rs = stmt.executeQuery();
			ResultSetMetaData rsmd = rs.getMetaData();
			while (rs.next()) {
				Map<String,Object> map = new HashMap<String,Object>();
                for(int i = 0 ; i < rsmd.getColumnCount() ; i++){
                    String col_name = rsmd.getColumnName(i+1);
                    Object col_value = rs.getObject(col_name);
                    if(col_value == null){
                        col_value = "";
                    }
                    map.put(col_name, col_value);
                }
                list.add(map);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			log.info("【com.jinzhenghb.ec9.tools.SQLconnect】--查询数据库异常:" + e.getMessage());
			System.out.println("【com.jinzhenghb.ec9.tools.SQLconnect】--查询数据库异常:" + e.getMessage());
		} finally {
			MyJDBCUtils.release(conn, stmt, rs);// 释放资源
		}
		return list;
	}
	
	/**
	 * 新增/修改 
	 * @param sql 新增/修改的sql语句
	 * @param params 不定个数的参数
	 */
	public static void execute(String sql, String... params) {
		log.info("【com.jinzhenghb.ec9.tools.SQLconnect】--更改数据库获取数据，sql:" + sql + "，参数:" + JSONObject.toJSONString(params));
		System.out.println("【com.jinzhenghb.ec9.tools.SQLconnect】--更改数据库获取数据，sql:" + sql + "，参数:" + JSONObject.toJSONString(params));
		// 连接
		Connection conn = MyJDBCUtils.mysqlConnect();
		// 创建执行 SQL 的语句Statement
		PreparedStatement stmt = null;
		try {
			stmt = conn.prepareStatement(sql,params);
			for (int i = 0; i < params.length; i++) {
				stmt.setString(i+1, params[i]);
			}
			stmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			log.info("【com.jinzhenghb.ec9.tools.SQLconnect】--修改数据库异常:" + e.getMessage());
			System.out.println("【com.jinzhenghb.ec9.tools.SQLconnect】--修改数据库异常:" + e.getMessage());
		} finally {
			MyJDBCUtils.release(conn, stmt, null);// 释放资源
		}
	}
	
}
